const express = require("express")
const cors = require("cors")

const { expressjwt } = require("express-jwt") // 解析token

const { secretKey } = require("./src/auth/global") // token密钥

const app = express()

app.use(cors()) // 解决跨域
app.use(express.json()) // 解析json字符串

/**
 * 全局中间件，校验token
 * common开头的接口(登录、注册、登出)不校验
 */
app.use(
  expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/common\//],
  })
)

/**
 * 接口全局中间件，封装res回调函数
 * code 状态码
 * data 接口需要返回的额外参数
 */
app.use((req, res, next) => {
  // 成功回调
  res.success = (data = {}) => {
    res.send({
      code: 200,
      msg: "操作成功",
      ...data,
    })
  }
  // 失败回调
  res.fail = (err = "操作失败", data = {}, code = 500) => {
    res.send({
      code,
      msg: err instanceof Error ? err.message : err,
      ...data,
    })
  }
  next()
})

const commonRouter = require("./src/route/common/common") // 通用接口
const goodsRouter = require("./src/route/goods/index") // 商品管理接口
app.use("/common", commonRouter)
app.use("/goods", goodsRouter)

/**
 * 全局错误中间件
 */
app.use((err, req, res, next) => {
  console.log("全局中间件")
  if (err.name === "UnauthorizedError") {
    res.send({
      code: 401,
      msg: "无效的token",
    })
    return
  } else {
    res.cb("接口错误")
  }
})

app.listen(5001, () => {})
